﻿/*
 * 由SharpDevelop创建。
 * 用户： liang
 * 日期: 2016/2/27 星期六
 * 时间: 10:22
 *
 * 要改变这种模板请点击 工具|选项|代码编写|编辑标准头文件
 */
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;

namespace CAN_GB_Analysis
{
	/// <summary>
	/// Description of MainForm.
	/// </summary>
	public partial class MainForm : Form
	{
		public MainForm ()
		{
			//
			// The InitializeComponent() call is required for Windows Forms designer support.
			//
			InitializeComponent ();

			//
			// TODO: Add constructor code after the InitializeComponent() call.
			//
		}
		void Btn_analysisClick (object sender, EventArgs e)
		{
			char[] src = txb_text.Text.ToCharArray ();
			byte[] p = new byte[src.Length];
			byte[] des = new byte[2048];
			byte[] temp = new byte[2048];
			UInt16 offset = 0;
			float temp_float = 0;
			float rx_volt=0;
			float cal_volt =0;
			int temp_16 = 0;
			byte temp_8 = 0;
            UInt32 temp_32 = 0;
            Byte[] VIN = new byte[17];

			if (src.Length == 0)
			{
				MessageBox.Show ("请输入解析数据");
				return;
			}

			for (int i = 0; i < src.Length; i++)
			{
				p[i] = Convert.ToByte (src[i]);
			}
			UInt32 hexlen = Ascii2Byte (temp, p, (UInt16) (src.Length));
			if(hexlen == 0xFFFF)
			{
				txb_analysis.ForeColor = Color.Red;
				txb_analysis.Font = new Font("黑体",12,FontStyle.Bold);
				txb_analysis.AppendText ("> 数据异常,长度无效： "+hexlen.ToString("d")+"\r\n");
				return;
			}
			//处理数据缺少帧头0x23 0x23 的数据
			if ((temp[0] == 0x02) || (temp[0] == 0x03))
			{
				des[0] = 0x23;
				des[1] = 0x23;
				for (int i=0;i<hexlen;i++)
				{
					des[i+2] = temp[i];
				}
				hexlen += 2;
			}
			//完整的数据
			else
			{
				for (int i=0;i<hexlen;i++)
				{
					des[i] = temp[i];
				}
			}
			if ((des[0] == 0x23) && (des[1] == 0x23))
			{
				byte xor_check = 0;
				for (int i = 2; i < hexlen - 1; i++)
				{
					xor_check ^= des[i];
				}
				if (xor_check != des[hexlen - 1])
				{
					txb_analysis.ForeColor = Color.Red;
					txb_analysis.Font = new Font("黑体",12,FontStyle.Bold);
					txb_analysis.AppendText ("> 校验错误\r\n");
					txb_analysis.AppendText ("> 计算异或值: 0x" + xor_check.ToString ("X2") + "\r\n");
					txb_analysis.AppendText ("> 帧内异或值: " + des[hexlen - 1].ToString ("X2") + "\r\n\r\n");
					txb_analysis.ForeColor = Color.Yellow;
					txb_analysis.Font = new Font("宋体",10,FontStyle.Regular);
				}
				else
				{
					txb_analysis.ForeColor = Color.Yellow;
					txb_analysis.Font = new Font("宋体",10,FontStyle.Regular);
					txb_analysis.BackColor = Color.Black;
					txb_analysis.AppendText ("> 本帧数据总长度: " + hexlen.ToString ("d2") + "\r\n");
					txb_analysis.AppendText ("> 校验正确: " + xor_check.ToString ("X2") + "\r\n\r\n");
					#region /* 帧头解析 */
					txb_analysis.AppendText ("> 帧头   :  " + des[0].ToString ("X") + " " + des[1].ToString ("X") + "\r\n");
					txb_analysis.AppendText ("> 命令标识: " + des[2].ToString ("X2") + "\r\n");
					txb_analysis.AppendText ("> 应答标识: " + des[3].ToString ("X2") + "\r\n");
					for (int i = 0; i < 17; i++)
					{
						VIN[i] = des[i + 4];
					}
					string vin = System.Text.Encoding.Default.GetString (VIN);
					txb_analysis.AppendText ("> 设备编号: " + vin + "\r\n");
					if (des[21] == 0x01)
					{
						txb_analysis.AppendText ("> 数据加密方式: 不加密\r\n");
					}
					else
					{
						txb_analysis.AppendText ("> 数据加密方式: 加密\r\n");
					}
					temp_16 = des[22] << 8 | des[23];
					txb_analysis.AppendText ("> 数据单元长度: " + temp_16 + "\r\n");
					txb_analysis.AppendText ("> 数据上报时间: " + (des[24] + 2000).ToString ("d4") + "-" + des[25].ToString ("d2") + "-" + des[26].ToString ("d2") + " " + des[27].ToString ("d2") + ":" + des[28].ToString ("d2") + ":" + des[29].ToString ("d2") + "\r\n");
					offset += 30;
					#endregion

					#region /* 实时和盲区的数据解析 23 23 02*/
					if ((des[2] == 0x02) || (des[2] == 0x03)) //在实时数据或盲区数据时才进行一下逻辑
					{
						if (des[2] == 0x02)
							txb_analysis.AppendText ("\r\n> 数据类型: 实时数据\r\n");
						else
							txb_analysis.AppendText ("\r\n> 数据类型: 盲区数据\r\n");

						#region /* 整车数据解析 */
						if (des[offset + 0] == 0x01)
						{
							txb_analysis.AppendText ("> ------------------ 整车数据 --------------------\r\n");
							txb_analysis.AppendText ("> 车辆状态: ");
							switch (des[offset + 1])
							{
								case 0x01:
									txb_analysis.AppendText ("启动\r\n");
									break;
								case 0x02:
									txb_analysis.AppendText ("熄火\r\n");
									break;
								case 0x03:
									txb_analysis.AppendText ("其他状态\r\n");
									break;
								case 0xFE:
									txb_analysis.AppendText ("异常\r\n");
									break;
								case 0xFF:
									txb_analysis.AppendText ("无效\r\n");
									break;
								default:
									txb_analysis.ForeColor = Color.Red;
									txb_analysis.Font = new Font("黑体",12,FontStyle.Bold);
									txb_analysis.AppendText ("错误的值："+des[offset + 1].ToString("X2")+ "\r\n");
									txb_analysis.ForeColor = Color.Yellow;
									txb_analysis.Font = new Font("宋体",10,FontStyle.Regular);
									break;
							}
							txb_analysis.AppendText ("> 充电状态: ");
							switch (des[offset + 2])
							{
								case 0x01:
									txb_analysis.AppendText ("停车充电\r\n");
									break;
								case 0x02:
									txb_analysis.AppendText ("行驶充电\r\n");
									break;
								case 0x03:
									txb_analysis.AppendText ("未充电\r\n");
									break;
								case 0x04:
									txb_analysis.AppendText ("充电完成\r\n");
									break;
								case 0xFE:
									txb_analysis.AppendText ("异常\r\n");
									break;
								case 0xFF:
									txb_analysis.AppendText ("无效\r\n");
									break;
								default:
									txb_analysis.ForeColor = Color.Red;
									txb_analysis.Font = new Font("黑体",12,FontStyle.Bold);
									txb_analysis.AppendText ("错误的值："+des[offset + 2].ToString("X2")+ "\r\n");
									txb_analysis.ForeColor = Color.Yellow;
									txb_analysis.Font = new Font("宋体",10,FontStyle.Regular);
									break;
							}
							txb_analysis.AppendText ("> 运行模式: ");
							switch (des[offset + 3])
							{
								case 0x01:
									txb_analysis.AppendText ("纯电\r\n");
									break;
								case 0x02:
									txb_analysis.AppendText ("混合\r\n");
									break;
								case 0x03:
									txb_analysis.AppendText ("燃油\r\n");
									break;
								case 0xFE:
									txb_analysis.AppendText ("异常\r\n");
									break;
								case 0xFF:
									txb_analysis.AppendText ("无效\r\n");
									break;
								default:
									txb_analysis.ForeColor = Color.Red;
									txb_analysis.Font = new Font("黑体",12,FontStyle.Bold);
									txb_analysis.AppendText ("错误的值："+des[offset + 3].ToString("X2")+ "\r\n");
									txb_analysis.ForeColor = Color.Yellow;
									txb_analysis.Font = new Font("宋体",10,FontStyle.Regular);
									break;
							}
							temp_16 = des[offset + 4] << 8 | des[offset + 5];
							txb_analysis.AppendText ("> 车速: " + ((float) temp_16 / 10) + "km/h （0x" + Convert.ToString(temp_16, 16).ToUpper() + "）\r\n");
                            temp_32 = (((UInt32)des[offset + 6] << 24) | ((UInt32)des[offset + 7] << 16) | ((UInt32)des[offset + 8] << 8) | ((UInt32)des[offset + 9]));
                            if (temp_32 < 0xFFFFFFFE)
                            {
                                txb_analysis.AppendText("> 累计里程: " + ((float)temp_32 / 10) + "KM （0x" + Convert.ToString(temp_32, 16).ToUpper() + "）\r\n");
                            }
                            else
                            {
                                txb_analysis.AppendText("> 累计里程: 无效\r\n");
                            }
							temp_16 = (UInt16)(des[offset + 10] << 8 | des[offset + 11]);
                            rx_volt = (float)temp_16;
                            temp_float = (float)temp_16 / 10;
							txb_analysis.AppendText ("> 总电压: " + temp_float.ToString("f1") + "V （0x" + Convert.ToString(temp_16, 16).ToUpper() + "）\r\n");
							temp_16 = des[offset + 12] << 8 | des[offset + 13];
							temp_float = (float) temp_16 / 10;
							txb_analysis.AppendText ("> 总电流: " + (temp_float - 1000).ToString ("f1") + "A （0x" + Convert.ToString(temp_16, 16).ToUpper() + "）\r\n");
							txb_analysis.AppendText ("> SOC: " + des[offset + 14].ToString ("d2") + "%\r\n");
							txb_analysis.AppendText ("> DC-DC状态: ");
							switch (des[offset + 15])
							{
								case 0x01:
									txb_analysis.AppendText ("工作\r\n");
									break;
								case 0x02:
									txb_analysis.AppendText ("断开\r\n");
									break;
								case 0xFE:
									txb_analysis.AppendText ("异常\r\n");
									break;
								case 0xFF:
									txb_analysis.AppendText ("无效\r\n");
									break;
								default:
									txb_analysis.ForeColor = Color.Red;
									txb_analysis.Font = new Font("黑体",12,FontStyle.Bold);
									txb_analysis.AppendText ("错误的值："+des[offset + 15].ToString("X2")+ "\r\n");
									txb_analysis.ForeColor = Color.Yellow;
									txb_analysis.Font = new Font("宋体",10,FontStyle.Regular);
									break;
							}
							if (((des[offset + 16] & 0x20) >> 5) == 0x01)
								txb_analysis.AppendText ("> 驱动力状态: 有驱动力\r\n");
							else
								txb_analysis.AppendText ("> 驱动力状态: 无驱动力\r\n");
							if (((des[offset + 16] & 0x10) >> 4) == 0x01)
								txb_analysis.AppendText ("> 制动力状态: 有制动力\r\n");
							else
								txb_analysis.AppendText ("> 制动力状态: 无制动力\r\n");
							txb_analysis.AppendText ("> 档位状态: ");
							switch (des[offset + 16] & 0x0F)
							{
								case 0x00:
									txb_analysis.AppendText ("空挡\r\n");
									break;
								case 0x01:
									txb_analysis.AppendText ("1挡\r\n");
									break;
								case 0x02:
									txb_analysis.AppendText ("2挡\r\n");
									break;
								case 0x03:
									txb_analysis.AppendText ("3挡\r\n");
									break;
								case 0x04:
									txb_analysis.AppendText ("4挡\r\n");
									break;
								case 0x05:
									txb_analysis.AppendText ("5挡\r\n");
									break;
								case 0x06:
									txb_analysis.AppendText ("6挡\r\n");
									break;
								case 0x07:
									txb_analysis.AppendText ("7挡\r\n");
									break;
								case 0x08:
									txb_analysis.AppendText ("8挡\r\n");
									break;
								case 0x09:
									txb_analysis.AppendText ("9挡\r\n");
									break;
								case 0x0A:
									txb_analysis.AppendText ("10挡\r\n");
									break;
								case 0x0B:
									txb_analysis.AppendText ("11挡\r\n");
									break;
								case 0x0C:
									txb_analysis.AppendText ("12挡\r\n");
									break;
								case 0x0D:
									txb_analysis.AppendText ("倒挡\r\n");
									break;
								case 0x0E:
									txb_analysis.AppendText ("自动D挡\r\n");
									break;
								case 0x0F:
									txb_analysis.AppendText ("停车P挡\r\n");
									break;
								default:
									txb_analysis.ForeColor = Color.Red;
									txb_analysis.Font = new Font("黑体",12,FontStyle.Bold);
									txb_analysis.AppendText ("错误的值："+des[offset + 16].ToString("X2")+ "\r\n");
									txb_analysis.ForeColor = Color.Yellow;
									txb_analysis.Font = new Font("宋体",10,FontStyle.Regular);
									break;
							}
							temp_16 = des[offset + 17] << 8 | des[offset + 18];
							txb_analysis.AppendText ("> 绝缘电阻: " + temp_16 + " KΩ （0x" + Convert.ToString(temp_16, 16).ToUpper() + "）\r\n");
							txb_analysis.AppendText ("> 加速踏板: " + des[offset + 19].ToString ("d2") + "%\r\n");
							if (des[offset + 20] == 0x65)
								txb_analysis.AppendText ("> 制动踏板: 制动有效\r\n");
							else
								txb_analysis.AppendText ("> 制动踏板: " + des[offset + 20].ToString ("d2") + "%\r\n");
							offset += 21;
						}
						#endregion

						#region/* 驱动电机数据 */
						if (des[offset + 0] == 0x02)
						{
							txb_analysis.AppendText ("> ------------------ 驱动电机数据 ----------------\r\n");
							txb_analysis.AppendText ("> 电机个数: " + des[offset + 1].ToString ("d2") + "\r\n");
							temp_8 = des[offset + 1];
							offset +=2;
							for (int i = 0; i < temp_8; i++)
							{
								txb_analysis.AppendText ("\r\n> 电机序号: " + des[offset + 0].ToString ("d2") + "\r\n");
								txb_analysis.AppendText ("> 电机状态: ");
								switch (des[offset + 1])
								{
									case 0x01:
										txb_analysis.AppendText ("耗电\r\n");
										break;
									case 0x02:
										txb_analysis.AppendText ("发电\r\n");
										break;
									case 0x03:
										txb_analysis.AppendText ("关闭状态\r\n");
										break;
									case 0x04:
										txb_analysis.AppendText ("准备状态\r\n");
										break;
									case 0xFE:
										txb_analysis.AppendText ("异常\r\n");
										break;
									case 0xFF:
										txb_analysis.AppendText ("无效\r\n");
										break;
									default:
										txb_analysis.ForeColor = Color.Red;
										txb_analysis.Font = new Font("黑体",12,FontStyle.Bold);
										txb_analysis.AppendText ("错误的值: "+des[offset + 1]+"\r\n");
										txb_analysis.ForeColor = Color.Yellow;
										txb_analysis.Font = new Font("宋体",10,FontStyle.Regular);
										break;
								}
								txb_analysis.AppendText ("> 电机控制器温度: " + (des[offset + 2] - 40).ToString ("d2") + " ℃\r\n");
								temp_16 = des[offset + 3] << 8 | des[offset + 4];
								txb_analysis.AppendText ("> 电机转速: " + (temp_16 - 20000).ToString() + " r/min （0x" + Convert.ToString(temp_16, 16).ToUpper() + "）\r\n");
								temp_16 = des[offset + 5] << 8 | des[offset + 6];
								temp_float = (float) temp_16 / 10;
								txb_analysis.AppendText ("> 电机转矩: " + (temp_float - 2000).ToString("f1") + " N·m （0x" + Convert.ToString(temp_16, 16).ToUpper() + "）\r\n");
								txb_analysis.AppendText ("> 电机温度: " + (des[offset + 7] - 40).ToString ("d2") + " ℃\r\n");
	
								temp_16 = des[offset + 8] << 8 | des[offset + 9];
								if ((temp_16 == 0xffff) || (temp_16 == 0xfffe))
								{
									txb_analysis.AppendText ("> 电机电压: 无效/异常\r\n");
								}
								else
								{
									if((temp_16 -rx_volt) > 1)
									{
										txb_analysis.AppendText ("> 电机电压大于总电压:");
										txb_analysis.AppendText (" 总电压:" +(rx_volt/10).ToString("f1")+"   ");
										txb_analysis.AppendText (" 电机电压:"+(temp_16/10).ToString("f1")+"\r\n");
									}
									txb_analysis.AppendText ("> 电机电压: " + (float) temp_16 / 10 + "V （0x" + Convert.ToString(temp_16, 16).ToUpper() + "）\r\n");
								}
	
								temp_16 = des[offset + 10] << 8 | des[offset + 11];
								if ((temp_16 == 0xffff) || (temp_16 == 0xfffe))
								{
									txb_analysis.AppendText ("> 电机电流: 无效/异常\r\n");
								}
								else
								{
									temp_float = (float) temp_16 / 10;
									txb_analysis.AppendText ("> 电机电流: " + (temp_float - 1000).ToString("f1") + "A （0x" + Convert.ToString(temp_16, 16).ToUpper() + "）\r\n");
								}
								offset += 12;
							}
							
						}
						#endregion

						#region/* 燃料电池数据 */
						if (des[offset + 0] == 0x03)
						{
							txb_analysis.AppendText ("> ------------------ 燃料电池数据 ----------------\r\n");
							offset += 0;
						}
						#endregion

						#region/* 发动机数据 */
						if (des[offset + 0] == 0x04)
						{
							txb_analysis.AppendText ("> ------------------ 发动机数据 ------------------\r\n");
							switch (des[offset + 1])
							{
							case 1:
								txb_analysis.AppendText ("> 发动机状态: 启动" + "\r\n");
								break;
							case 2:
								txb_analysis.AppendText ("> 发动机状态: 关闭" + "\r\n");
								break;
							default:
								txb_analysis.AppendText ("> 发动机状态: 无效/异常" + "\r\n");
								break;
							}

							temp_16 = des[offset + 2] << 8 | des[offset + 3];
							if ((temp_16 == 0xffff) || (temp_16 == 0xfffe))
							{
								txb_analysis.AppendText ("> 曲轴转速: 无效/异常" + "\r\n");
							}
							else
							{
								txb_analysis.AppendText ("> 曲轴转速: " + temp_16.ToString ("d") + " rpm\r\n");
							}

							temp_16 = des[offset + 4] << 8 | des[offset + 5];
							if ((temp_16 == 0xffff) || (temp_16 == 0xfffe))
							{
								txb_analysis.AppendText ("> 燃料消耗率: 无效/异常" + "\r\n");
							}
							else
							{
								txb_analysis.AppendText ("> 燃料消耗率: " + (temp_16/100).ToString ("d") + "L/100km\r\n");
							}
							offset += 6;
						}
						#endregion

						#region/* 定位数据 */
						if (des[offset + 0] == 0x05)
						{
							txb_analysis.AppendText ("> ------------------ 定位数据 --------------------\r\n");
							if ((des[offset + 1] & 0x01) == 0x00)
							{
								txb_analysis.AppendText ("> 定位状态: 已定位\r\n");
								int temp_jingdu = des[offset + 2] << 24 | des[offset + 3] << 16 | des[offset + 4] << 8 | des[offset + 5];
								int temp_weidu = des[offset + 6] << 24 | des[offset + 7] << 16 | des[offset + 8] << 8 | des[offset + 9];
								if (((des[offset + 1] & 0x04) >> 2) == 0x01)
								{
									txb_analysis.AppendText ("> 西经: " + (temp_jingdu / 1000000).ToString ("d3") + "." + (temp_jingdu % 1000000).ToString ("d6") + " 度\r\n");
								}
								else
								{
									txb_analysis.AppendText ("> 东经: " + (temp_jingdu / 1000000).ToString ("d3") + "." + (temp_jingdu % 1000000).ToString ("d6") + " 度\r\n");
								}
								if (((des[offset + 1] & 0x02) >> 1) == 0x01)
								{
									txb_analysis.AppendText ("> 南纬: " + (temp_weidu / 1000000).ToString ("d2") + "." + (temp_weidu % 1000000).ToString ("d6") + " 度\r\n");
								}
								else
								{
									txb_analysis.AppendText ("> 北纬: " + (temp_weidu / 1000000).ToString ("d2") + "." + (temp_weidu % 1000000).ToString ("d6") + " 度\r\n");
								}
							}
							else
							{
								txb_analysis.AppendText ("> 定位状态: 未定位\r\n");
							}
							offset += 10;
						}
						#endregion

						#region/* 极值数据 */
						if (des[offset + 0] == 0x06)
						{
							txb_analysis.AppendText ("> ------------------ 极值数据 --------------------\r\n");
							txb_analysis.AppendText ("> 最高电压单体所在包号: " + des[offset + 1] + "\r\n");
							txb_analysis.AppendText ("> 最高电压单体电池序号: " + des[offset + 2] + "\r\n");
							temp_16 = des[offset + 3] << 8 | des[offset + 4];
							txb_analysis.AppendText ("> 最高电压单体电压值: " + (float) temp_16 / 1000 + "V\r\n");
							txb_analysis.AppendText ("> 最低电压单体所在包号: " + des[offset + 5] + "\r\n");
							txb_analysis.AppendText ("> 最低电压单体电池序号: " + des[offset + 6] + "\r\n");
							temp_16 = des[offset + 7] << 8 | des[offset + 8];
							txb_analysis.AppendText ("> 最低电压单体电压值: " + (float) temp_16 / 1000 + "V\r\n");
							txb_analysis.AppendText ("> 最高温度单体所在包号: " + des[offset + 9] + "\r\n");
							txb_analysis.AppendText ("> 最高温度探针序号: " + des[offset + 10] + "\r\n");
							txb_analysis.AppendText ("> 最高温度单体温度值: " + (des[offset + 11] - 40).ToString () + "℃\r\n");
							txb_analysis.AppendText ("> 最低温度单体所在包号: " + des[offset + 12] + "\r\n");
							txb_analysis.AppendText ("> 最低温度探针序号: " + des[offset + 13] + "\r\n");
							txb_analysis.AppendText ("> 最低温度单体温度值: " + (des[offset + 14] - 40).ToString () + "℃\r\n");
							offset += 15;
						}
						#endregion

						#region/* 报警数据 */
						if (des[offset + 0] == 0x07)
						{
							txb_analysis.AppendText ("> ------------------ 报警数据 -------------------\r\n");
							if (des[offset + 1] <= 0)
							{
								txb_analysis.AppendText ("> 最高报警等级: 本帧无报警\r\n");

                                if ((des[offset + 10] != 0x08) && (des[offset + 10] != xor_check))//检查数据有效性
                                {
                                    txb_analysis.AppendText("\r\n> ！！！警告！！！ 有故障码，但是没有故障等级！\r\n\r\n");
                                }
                            }
							else if ((des[offset + 1] == 0xff) ||(des[offset + 1] == 0xfe))
							{
								txb_analysis.AppendText ("> 最高报警等级: 无效/异常\r\n");
							}
							else
							{
								txb_analysis.AppendText ("> 最高报警等级: " + des[offset + 1] + "\r\n");
							}

							UInt32 temp_alarm = ((UInt32)des[offset + 2] << 24) | (UInt32)(des[offset + 3] << 16) | (UInt32)(des[offset + 4] << 8) | (UInt32)des[offset + 5];
							if ((temp_alarm & 0x00000001) == 1)
								txb_analysis.AppendText ("  温度差异报警\r\n");
							if (((temp_alarm & 0x00000002) >> 1) == 1)
								txb_analysis.AppendText ("  电池高温报警\r\n");
							if (((temp_alarm & 0x00000004) >> 2) == 1)
								txb_analysis.AppendText ("  电池包过压\r\n");
							if (((temp_alarm & 0x00000008) >> 3) == 1)
								txb_analysis.AppendText (" 电池包欠压\r\n");
							if (((temp_alarm & 0x00000010) >> 4) == 1)
								txb_analysis.AppendText ("  SOC低压\r\n");
							if (((temp_alarm & 0x00000020) >> 5) == 1)
								txb_analysis.AppendText ("  单体过压\r\n");
							if (((temp_alarm & 0x00000040) >> 6) == 1)
								txb_analysis.AppendText ("  单体欠压\r\n");
							if (((temp_alarm & 0x00000080) >> 7) == 1)
								txb_analysis.AppendText ("  SOC过高\r\n");
							if (((temp_alarm & 0x00000100) >> 8) == 1)
								txb_analysis.AppendText ("  SOC跳变\r\n");
							if (((temp_alarm & 0x00000200) >> 9) == 1)
								txb_analysis.AppendText ("  动力蓄电池包不匹配\r\n");
							if (((temp_alarm & 0x00000400) >> 10) == 1)
								txb_analysis.AppendText ("  单体一致性差\r\n");
							if (((temp_alarm & 0x00000800) >> 11) == 1)
								txb_analysis.AppendText ("  绝缘故障\r\n");
							if (((temp_alarm & 0x00001000) >> 12) == 1)
								txb_analysis.AppendText (" DC-DC温度\r\n");
							if (((temp_alarm & 0x00002000) >> 13) == 1)
								txb_analysis.AppendText ("  制动系统报警\r\n");
							if (((temp_alarm & 0x00004000) >> 14) == 1)
								txb_analysis.AppendText ("  DC-DC状态报警\r\n");
							if (((temp_alarm & 0x00008000) >> 15) == 1)
								txb_analysis.AppendText ("  电机控制器温度报警\r\n");
							if (((temp_alarm & 0x00010000) >> 16) == 1)
								txb_analysis.AppendText ("  高压互锁状态\r\n");
							if (((temp_alarm & 0x00020000) >> 17) == 1)
								txb_analysis.AppendText ("  电机温度报警\r\n");
							if (((temp_alarm & 0x00040000) >> 18) == 1)
								txb_analysis.AppendText ("  电池类型过充\r\n");
							offset += 6;

							if ((des[offset + 0] == 0xff) || (des[offset + 0] == 0xfe))
							{
								txb_analysis.AppendText ("> 电池报警总数: 无效/异常\r\n");
								offset += 1;
							}
							else
							{
								txb_analysis.AppendText ("> 电池报警总数: " + des[offset + 0] + "\r\n");
								temp_16 = 0;
								if (des[offset] > 0)
								{
									temp_16 = (des[offset] * 4);/* 计算故障个数*/
									for (int i = 0; i < temp_16; i += 4)
									{
										if (((i/4) % 5) == 0)
										{
											if ((i/4) == 0)
												txb_analysis.AppendText ("> 第01行故障码:  ");
											else
											{
												int bms_alarm_val = ((i/4) / 5) + 1;
												txb_analysis.AppendText ("\r\n> 第" + (bms_alarm_val).ToString ("d2") + "行故障码:  ");
											}
										}
										int bms_alarm = des[offset+1 + i] << 24 | des[offset + i + 2] << 16 | des[offset + i + 3] << 8 | des[offset + i + 4];
										txb_analysis.AppendText (" " + bms_alarm.ToString ("X8"));
									}
									offset += (UInt16) (temp_16+1);
								}
								else
								{
									offset += 1;
								}
								if(temp_16>0)
									txb_analysis.AppendText ("\r\n");
							}

							if ((des[offset + 0] == 0xff) || (des[offset + 0] == 0xfe))
							{
								txb_analysis.AppendText ("> 电机报警总数: 无效/异常\r\n");
								offset += 1;
							}
							else
							{
								txb_analysis.AppendText ("> 电机报警总数: " + des[offset + 0] + "\r\n");
								temp_16 = 0;
								if (des[offset] > 0)
								{
									temp_16 = (des[offset] * 4);/* 计算故障个数*/
									for (int i = 0; i < temp_16; i += 4)
									{
										if (((i/4) % 5) == 0)
										{
											if ((i/4) == 0)
												txb_analysis.AppendText ("> 第01行故障码:  ");
											else
											{
												int vcu_alarm_val = ((i/4) / 5) + 1;
												txb_analysis.AppendText ("\r\n> 第" + (vcu_alarm_val).ToString("d2") + "行故障码:  ");
											}
										}
										int vcu_alarm = des[offset+ 1 + i] << 24 | des[offset + i + 2] << 16 | des[offset + i + 3] << 8 | des[offset + i + 4];
										txb_analysis.AppendText (" "+ vcu_alarm.ToString ("X8"));
									}
									offset += (UInt16) (temp_16 + 1);
								}
								else
								{
									offset += 1;
								}
								if(temp_16>0)
									txb_analysis.AppendText ("\r\n");
							}

							if ((des[offset + 0] == 0xff) || (des[offset + 0] == 0xfe))
							{
								txb_analysis.AppendText ("> 发动机报警总数: 无效/异常\r\n");
								offset += 1;
							}
							else
							{
								txb_analysis.AppendText ("> 发动机报警总数: " + des[offset + 0] + "\r\n");
								temp_16 = 0;
								if (des[offset] > 0)
								{
									temp_16 = (des[offset] * 4);/* 计算故障个数*/
									for (int i = 0; i < temp_16; i += 4)
									{
										if (((i/4) % 5) == 0)
										{
											if ((i/4) == 0)
												txb_analysis.AppendText ("> 第1行故障码:  ");
											else
											{
												int fd_alarm_val = ((i/4) / 5) + 1;
												txb_analysis.AppendText ("\r\n> 第" + (fd_alarm_val).ToString("d2") + "行故障码:  ");
											}
										}
										int fd_alarm = des[offset + 1+i] << 24 | des[offset + i + 2] << 16 | des[offset + i + 3] << 8 | des[offset + i + 4];
										txb_analysis.AppendText (" " + fd_alarm.ToString ("X8"));
									}
									offset += (UInt16) (temp_16+1);
								}
								else
								{
									offset += 1;
								}
								if(temp_16>0)
									txb_analysis.AppendText ("\r\n");
							}

							if ((des[offset + 0] == 0xff) || (des[offset + 0] == 0xfe))
							{
								txb_analysis.AppendText ("> 其他报警总数: 无效/异常\r\n");
								offset += 1;
							}
							else
							{
								txb_analysis.AppendText ("> 其他报警总数: " + des[offset + 0] + "\r\n");
								temp_16 = 0;
								if (des[offset] > 0)
								{
									temp_16 = (des[offset] * 4);/* 计算故障个数*/
									for (int i = 0; i < (des[offset] * 4); i += 4)
									{
										if (((i/4) % 5) == 0)
										{
											if ((i/4) == 0)
												txb_analysis.AppendText ("> 第1行故障码:  ");
											else
											{
												int oth_alarm_val = ((i/4) / 5) + 1;
												txb_analysis.AppendText ("\r\n> 第" + (oth_alarm_val).ToString("d2") + "行故障码:  ");
											}
										}
										int oth_alarm = des[offset + 1 +i] << 24 | des[offset + i + 2] << 16 | des[offset + i + 3] << 8 | des[offset + i + 4];
										txb_analysis.AppendText (" " + oth_alarm.ToString ("X8"));
									}
									offset += (UInt16) (temp_16+1);
								}
								else
								{
									offset += 1;
								}
								if(temp_16>0)
									txb_analysis.AppendText ("\r\n");
							}
						}
						#endregion

						#region/* 电池单体电压数据 */
						if (des[offset + 0] == 0x08)
						{
							String subbat = null;
							byte vol_system_total_num = 0;
							byte vol_sub_system_index = 0;
							int vol_cell_num = 0;
							subbat += "> ------------------ 单体电压数据 ---------------";
							subbat += "\r\n> 储能装置个数:    " + des[offset + 1] + "\r\n";
//							txb_analysis.AppendText ("> ------------------ 单体电压数据 ---------------");
//							txb_analysis.AppendText ("\r\n> 储能装置个数:    " + des[offset + 1] + "\r\n");
							vol_system_total_num = des[offset + 1];
							offset += 2;

							for (int i = 0; i < vol_system_total_num; i++)
							{
								subbat += "> 储能装置子系统号: " + des[offset + 0] + "\r\n";
//								txb_analysis.AppendText ("> 储能装置子系统号: " + des[offset + 0] + "\r\n");
								vol_sub_system_index = des[offset + 0];
								temp_16 = (des[offset + 1] << 8) + des[offset + 2];
								if ((temp_16 == 0xffff) || (temp_16 == 0xfffe))
								{
									subbat += "> 储能装置总电压: 无效/异常\r\n";
//									txb_analysis.AppendText ("> 储能装置总电压: 无效/异常\r\n");
								}
								else
								{
									subbat += "> 储能装置总电压: " + ((float) temp_16 / 10) + "V\r\n";
//									txb_analysis.AppendText ("> 储能装置总电压: " + ((float) temp_16 / 10) + "V\r\n");
								}
								temp_16 = (des[offset + 3] << 8) + des[offset + 4];
								temp_float = (float) temp_16 / 10;
								if ((temp_16 == 0xffff) || (temp_16 == 0xfffe))
								{
									subbat +="> 储能装置总电流: 无效/异常\r\n";
//									txb_analysis.AppendText ("> 储能装置总电流: 无效/异常\r\n");
								}
								else
								{
									subbat += "> 储能装置总电流: " + (temp_float - 1000).ToString ("f1") + "A\r\n";
//									txb_analysis.AppendText ("> 储能装置总电流: " + (temp_float - 1000).ToString ("f1") + "A\r\n");
								}
								temp_16 = (des[offset + 5] << 8) + des[offset + 6];
								subbat += "> 单体电池总数:  " + (temp_16) + "\r\n";
//								txb_analysis.AppendText ("> 单体电池总数:  " + (temp_16) + "\r\n");
								temp_16 = (des[offset + 7] << 8) + des[offset + 8];
								subbat += "> 本帧起始电池序号:  " + (temp_16) + "\r\n";
								subbat += "> 本帧单体电池总数: " + des[offset + 9] + "";
//								txb_analysis.AppendText ("> 本帧起始电池序号:  " + (temp_16) + "\r\n");
//								txb_analysis.AppendText ("> 本帧单体电池总数: " + des[offset + 9] + "");
								vol_cell_num = des[offset + 9];
								offset += 10;

								subbat += "\r\n> 第" + (vol_sub_system_index).ToString ("d2") + "个子系统数据:  ";
//								txb_analysis.AppendText ("\r\n> 第" + (vol_sub_system_index).ToString ("d2") + "个子系统数据:  ");

								for (int k=0;k<vol_cell_num;k++)
								{
									if (k%10 == 0)
									{
										subbat += "\r\n["+(k/10+1).ToString ("d2")+"] ";
//										txb_analysis.AppendText ("\r\n["+(k/10+1).ToString ("d2")+"] ");
									}

									temp_float = (des[offset + 0] << 8) + des[offset + 1];
									cal_volt += temp_float;
									subbat += "" + ((float)temp_float / 1000).ToString ("f3") + "V   ";
//									txb_analysis.AppendText ("" + ((float)temp_float / 1000).ToString ("f3") + "V   ");
									offset += 2;
								}
//								txb_analysis.AppendText ("\r\n");
								subbat += "\r\n";

							}
							if(System.Math .Abs(((float)rx_volt/10)-(cal_volt/1000)) > 1)
							{
								subbat += "\r\n> 总电压与单体电压不相等:";
								subbat += " 总电压:" +(rx_volt/10).ToString("f1")+"   ";
								subbat += " 单体电压:"+(cal_volt/1000).ToString("f1")+"\r\n";
//								txb_analysis.AppendText ("\r\n> 总电压与单体电压不相等:");
//								txb_analysis.AppendText (" 总电压:" +(rx_volt/10).ToString("f1")+"   ");
//								txb_analysis.AppendText (" 单体电压:"+(cal_volt/1000).ToString("f1")+"\r\n");
							}
							
							txb_analysis.AppendText(subbat);
						}
						#endregion

						#region/* 电池单体温度数据 */
						if (des[offset + 0] == 0x09)
						{
							String subtemp = null;
							byte temp_system_total_num = 0;
							int temp_cell_num = 0;
							subtemp += "\r\n> ------------------ 单体温度数据 ---------------\r\n";
							subtemp += "> 储能装置个数:    " + des[offset + 1] + "\r\n";
//							txb_analysis.AppendText ("\r\n> ------------------ 单体温度数据 ---------------\r\n");
//							txb_analysis.AppendText ("> 储能装置个数:    " + des[offset + 1] + "\r\n");
							temp_system_total_num = des[offset + 1];
							offset += 2;

							for (int i = 0; i < temp_system_total_num; i++)
							{
								subtemp += "> 储能装置子系统号: " + des[offset + 0] + "\r\n";
//								txb_analysis.AppendText ("> 储能装置子系统号: " + des[offset + 0] + "\r\n");
								temp_16 = (des[offset + 1] << 8) + des[offset + 2];
								subtemp += "> 储能装置温度探针个数:  " + (temp_16) + "";
//								txb_analysis.AppendText ("> 储能装置温度探针个数:  " + (temp_16) + "");
								temp_cell_num = temp_16;
								offset += 3;

								for (int k=0; k<temp_cell_num; k++)
								{
									if (k%10 == 0)
									{
										subtemp += "\r\n["+(k/10+1).ToString ("d2")+"] ";
//										txb_analysis.AppendText ("\r\n["+(k/10+1).ToString ("d2")+"] ");
									}
									subtemp += "" + (des[offset + 0] - 40).ToString ("d2") + "℃    ";
//									txb_analysis.AppendText ("" + (des[offset + 0] - 40).ToString ("d2") + "℃    ");
									offset++;
								}
								subtemp += "\r\n";
//								txb_analysis.AppendText ("\r\n");
							}
							
							txb_analysis.AppendText (subtemp);
						}
						#endregion

						#region/* 自定义0x80数据 */
						if (des[offset + 0] == 0x80)
						{
							txb_analysis.AppendText ("\r\n> ------------------ 自定义0x80数据 ---------------\r\n");
							txb_analysis.AppendText ("> ST86版本:    " + des[offset + 1].ToString("X2") + "\r\n");
							txb_analysis.AppendText ("> STM32版本:   " + des[offset + 2].ToString("X2") + "\r\n");
							offset+=3;
						}
						#endregion

						#region/* 自定义0x81数据 */
						if (des[offset + 0] == 0x81)
						{
							txb_analysis.AppendText ("\r\n> ------------------ 自定义0x81数据 ---------------\r\n");
							temp_32 = (((UInt32)des[offset + 1]<<24)|((UInt32)des[offset + 2]<<16)|((UInt32)des[offset + 3]<<8)|((UInt32)des[offset+4]));
							if(temp_32 < 0xFFFFFFFE)
								txb_analysis.AppendText ("> 累计充电电量：" + ((float)temp_32/10) + "k.Wh\r\n");
							else
								txb_analysis.AppendText ("> 累计充电电量：无效\r\n");
							offset+=5;
						}
						#endregion

						#region/* 自定义0x82数据 */
						if (des[offset + 0] == 0x82)
						{
							txb_analysis.AppendText ("\r\n> ------------------ 自定义0x82数据 ---------------\r\n");
							temp_16 = (des[offset + 1]<<8)|(des[offset+2]);
							txb_analysis.AppendText ("> 用户代码：" + temp_16.ToString("X4") + "\r\n");
							temp_16 = (des[offset + 3]<<8)|(des[offset+4]);
							txb_analysis.AppendText ("> 车型代码：" + temp_16.ToString("X4") + "k.Wh\r\n");
							if(des[offset + 5] == 1)
								txb_analysis.AppendText ("> 锁车状态：已锁车\r\n");
							else if(des[offset + 5] == 0)
								txb_analysis.AppendText ("> 锁车状态：未锁车\r\n");
							else
								txb_analysis.AppendText ("> 锁车状态：无效\r\n");
							if(des[offset + 6] == 1)
								txb_analysis.AppendText ("> CAN状态：未连接\r\n");
							else if(des[offset + 6] == 0)
								txb_analysis.AppendText ("> CAN状态：已连接\r\n");
							else
								txb_analysis.AppendText ("> CAN状态：无效\r\n");
							if(des[offset + 7] == 1)
								txb_analysis.AppendText ("> 天线状态：未连接,短路/断开\r\n");
							else if(des[offset + 7] == 0)
								txb_analysis.AppendText ("> 天线状态：已连接\r\n");
							else
								txb_analysis.AppendText ("> 天线状态：无效\r\n");
							if(des[offset + 8] == 1)
								txb_analysis.AppendText ("> 断电状态：外部电断开\r\n");
							else if(des[offset + 8] == 0)
								txb_analysis.AppendText ("> 断电状态：未断开\r\n");
							else
								txb_analysis.AppendText ("> 断电状态：无效\r\n");
							if(des[offset + 9] == 1)
								txb_analysis.AppendText ("> SD状态：异常\r\n");
							else if(des[offset + 9] == 0)
								txb_analysis.AppendText ("> SD状态：正常\r\n");
							else
								txb_analysis.AppendText ("> SD状态：无效\r\n");
							temp_16 = (des[offset + 10]<<8)|(des[offset+11]);
							txb_analysis.AppendText ("> 航向角：" + temp_16.ToString("X4") + "\r\n");
							offset+=21;
						}
						#endregion

						#region/* 自定义0x91数据 */
						if (des[offset + 0] == 0x91)
						{
							txb_analysis.AppendText ("\r\n> ------------------ 自定义0x91数据 -------------\r\n");
							temp_16 = (des[offset + 1]<<8)|(des[offset+2]);
							txb_analysis.AppendText ("> 数据长度：" + temp_16.ToString("d") + " Byte\r\n");
							txb_analysis.AppendText ("> VCU1: 0x" + des[offset + 3].ToString("X2") + "");
							txb_analysis.AppendText (" " + des[offset + 4].ToString("X2") + "");
							txb_analysis.AppendText (" " + des[offset + 5].ToString("X2") + "");
							txb_analysis.AppendText (" " + des[offset + 6].ToString("X2") + "");
							txb_analysis.AppendText (" " + des[offset + 7].ToString("X2") + "");
							txb_analysis.AppendText (" " + des[offset + 8].ToString("X2") + "\r\n");
							txb_analysis.AppendText ("> BMS_VCU_7: 0x" + des[offset + 9].ToString("X2") + "");
							txb_analysis.AppendText (" " + des[offset + 10].ToString("X2") + "");
							txb_analysis.AppendText (" " + des[offset + 11].ToString("X2") + "");
							txb_analysis.AppendText (" " + des[offset + 12].ToString("X2") + "");
							txb_analysis.AppendText (" " + des[offset + 13].ToString("X2") + "");
							txb_analysis.AppendText (" " + des[offset + 14].ToString("X2") + "\r\n");
							txb_analysis.AppendText ("> MCU_VCU_4: 0x" + des[offset + 15].ToString("X2") + "");
							txb_analysis.AppendText (" " + des[offset + 16].ToString("X2") + "");
							txb_analysis.AppendText (" " + des[offset + 17].ToString("X2") + "");
							txb_analysis.AppendText (" " + des[offset + 18].ToString("X2") + "");
							txb_analysis.AppendText (" " + des[offset + 19].ToString("X2") + "");
							txb_analysis.AppendText (" " + des[offset + 20].ToString("X2") + "\r\n");
							txb_analysis.AppendText ("> Meter_VCU_2: 0x" + des[offset + 21].ToString("X2") + "");
							txb_analysis.AppendText (" " + des[offset + 22].ToString("X2") + "");
							txb_analysis.AppendText (" " + des[offset + 23].ToString("X2") + "");
							txb_analysis.AppendText (" " + des[offset + 24].ToString("X2") + "");
							txb_analysis.AppendText (" " + des[offset + 25].ToString("X2") + "");
							txb_analysis.AppendText (" " + des[offset + 26].ToString("X2") + "\r\n");
							temp_32 = (((UInt32)des[offset + 27]<<24)|((UInt32)des[offset + 28]<<16)|((UInt32)des[offset + 29]<<8)|((UInt32)des[offset+30]));
							if(temp_32 < 0xFFFFFFFE)
								txb_analysis.AppendText ("> 累计充电电量：" + ((float)temp_32/10) + "k.Wh\r\n");
							else
								txb_analysis.AppendText ("> 累计充电电量：无效\r\n");
							temp_16 = (des[offset + 31]<<8)|(des[offset+32]);
							if(temp_16 < 0xFFFE)
								txb_analysis.AppendText ("> 累计充电次数：" + temp_16.ToString("d") + "次\r\n");
							else
								txb_analysis.AppendText ("> 累计充电次数：无效\r\n");
							if(des[offset+33] == 1)
								txb_analysis.AppendText ("> AC-CC: 有效\r\n");
							else
								txb_analysis.AppendText ("> AC-CC: 无效\r\n");
							if(des[offset+34] == 1)
								txb_analysis.AppendText ("> DC-CC: 有效\r\n");
							else
								txb_analysis.AppendText ("> DC-CC: 无效\r\n");
							txb_analysis.AppendText ("> 电池类型:");
							switch(des[offset+35])
							{
								case 0:
									txb_analysis.AppendText (" 磷酸铁锂\r\n");
									break;
								case 1:
									txb_analysis.AppendText (" 锰酸锂\r\n");
									break;
								case 2:
									txb_analysis.AppendText (" 三元锂\r\n");
									break;
								case 3:
									txb_analysis.AppendText (" 混合三元锂\r\n");
									break;
								default:
									txb_analysis.AppendText (" 无效\r\n");
									break;
							}
							offset+=36;
						}
						#endregion

						#region/* 自定义0x83数据 */
						if (des[offset + 0] == 0x83)
						{
							txb_analysis.AppendText ("\r\n> ------------------ 自定义0x83数据 -------------\r\n");
							temp_16 = (des[offset + 1]<<8)|(des[offset+2]);
							txb_analysis.AppendText ("> 数据长度：" + temp_16.ToString("d") + " Byte\r\n");
							txb_analysis.AppendText ("> ST86版本: " + des[offset + 3].ToString("d2") + "\r\n");
							txb_analysis.AppendText ("> STM32版本: " + des[offset + 4].ToString("d2") + "\r\n");
							txb_analysis.AppendText ("> ST86内部版本: " + des[offset+ 6].ToString("d2") + "\r\n");
							txb_analysis.AppendText ("> STM32内部版本:" + des[offset+ 5].ToString("d2") + "\r\n");
							temp_16 = (des[offset + 7]<<8)|(des[offset+8]);
							txb_analysis.AppendText ("> 用户代码：" + temp_16.ToString("X4") + "\r\n");
							temp_16 = (des[offset + 9]<<8)|(des[offset+10]);
							txb_analysis.AppendText ("> 车型代码：" + temp_16.ToString("X4") + "\r\n");
							if(des[offset + 11] == 1)
								txb_analysis.AppendText ("> 锁车状态：已锁车\r\n");
							else if(des[offset + 11] == 0)
								txb_analysis.AppendText ("> 锁车状态：未锁车\r\n");
							else
								txb_analysis.AppendText ("> 锁车状态：无效\r\n");
							if(des[offset + 12] == 1)
								txb_analysis.AppendText ("> CAN状态： 未连接\r\n");
							else if(des[offset + 12] == 0)
								txb_analysis.AppendText ("> CAN状态： 已连接\r\n");
							else
								txb_analysis.AppendText ("> CAN状态： 无效\r\n");
							if(des[offset + 13] == 1)
								txb_analysis.AppendText ("> 天线状态：未连接,短路/断开\r\n");
							else if(des[offset + 13] == 0)
								txb_analysis.AppendText ("> 天线状态：已连接\r\n");
							else
								txb_analysis.AppendText ("> 天线状态：无效\r\n");
							if(des[offset + 14] == 1)
								txb_analysis.AppendText ("> 断电状态：外部电断开\r\n");
							else if(des[offset + 14] == 0)
								txb_analysis.AppendText ("> 断电状态：未断开\r\n");
							else
								txb_analysis.AppendText ("> 断电状态：无效\r\n");
							if(des[offset + 15] == 1)
								txb_analysis.AppendText ("> SD状态：异常\r\n");
							else if(des[offset + 15] == 0)
								txb_analysis.AppendText ("> SD状态：正常\r\n");
							else
								txb_analysis.AppendText ("> SD状态：无效\r\n");
							temp_16 = (des[offset + 16]<<8)|(des[offset+17]);
							txb_analysis.AppendText ("> 航向角：" + temp_16.ToString("X4") + "\r\n");
							if(des[offset + 18] == 0x7E)
								txb_analysis.AppendText ("> 锁车使能状态：支持锁车\r\n");
							else
								txb_analysis.AppendText ("> 锁车使能状态：不支持锁车\r\n");
							temp_16 = (des[offset + 19]<<8)|(des[offset+20]);
							if(temp_16 < 0xFFFE)
								txb_analysis.AppendText ("> 充电循环次数：" + temp_16.ToString("d") + "次\r\n");
							else
								txb_analysis.AppendText ("> 充电循环次数：无效\r\n");
							temp_32 = ((UInt32)(des[offset + 21]<<24)|((UInt32)des[offset + 22]<<16)|((UInt32)des[offset + 23]<<8)|((UInt32)des[offset+24]));
							if(temp_32< 0xFFFFFFFE)
								txb_analysis.AppendText ("> 累计充电电量：" + ((float)temp_32/10) + "k.Wh\r\n");
							else
								txb_analysis.AppendText ("> 累计充电电量：无效\r\n");
							offset+=27;
						}
						#endregion
					}
					#endregion

					#region /* 登录数据解析 23 23 01*/
					else if (des[2] == 0x01) //是实时数据或盲区数据时才进行一下逻辑
					{
						txb_analysis.AppendText ("\r\n> 数据类型: 登入数据\r\n");
						UInt16 login_number = (UInt16)((des[offset]<<8)+des[offset+1]);
						txb_analysis.AppendText ("> 登入序号: "+ login_number.ToString ("d2")+ "\r\n");
						if((des[offset+2] == 0x38)&&(des[offset+3] == 0x39))
						{
							Byte[] sim_iccid = new byte[20];
							for (int i = 0; i < 20; i++)
							{
								sim_iccid[i] = des[offset+ i + 2];
							}
							string iccid = System.Text.Encoding.Default.GetString (sim_iccid);
							txb_analysis.AppendText ("> ICCID编号: " + iccid + "\r\n");
						}
						else
						{
							txb_analysis.AppendText ("> ICCID 数据段错误\r\n");
							return;
						}
						txb_analysis.AppendText ("> 充电子系统个数: "+ des[offset+22].ToString ("d2")+ "\r\n");
						if(des[offset+23]>0)
						{
							txb_analysis.AppendText ("> 电池编码长度: "+ des[offset+23].ToString ("d2")+ "\r\n");
							Byte[] Bms_code = new byte[255];

							for (int i = 0; i < des[offset+23]; i++)
							{
								Bms_code[i] = des[offset+ i + 24];
							}
							string code = System.Text.Encoding.Default.GetString (Bms_code);
							txb_analysis.AppendText ("> 电池编号: " + code + "\r\n");
						}
						else
						{
							txb_analysis.AppendText ("> 本帧无电池编码\r\n");
						}
					}
					#endregion

					#region /* 登出数据解析 23 23 01*/
					else
					{
					}
					#endregion
				}
			}
			else if ((des[0] == 0xf1) && (des[1] == 0xf2) && (des[2] == 0xff))
			{
				#region /* 帧头解析 */
				txb_analysis.AppendText ("帧头:" + des[0] + des[1] + des[2] + "\r\n");
				offset += 4;
				txb_analysis.AppendText ("设备ID:");
				for (int i = 0; i < 16; i++)
				{
					txb_analysis.AppendText (des[i + offset].ToString ());
				}
				txb_analysis.AppendText ("\r\n");

				offset += 21;
				#endregion

				#region /* 基本信息 */
				offset += 4;
				offset += 2;
				txb_analysis.AppendText ("使用方编号:" + des[offset + 0] + "\r\n");
				txb_analysis.AppendText ("车型:" + des[offset + 1] + "\r\n");
				txb_analysis.AppendText ("协议版本号:" + des[offset + 2] + "\r\n");
				txb_analysis.AppendText ("软件版本号:" + des[offset + 3] + "\r\n");
				txb_analysis.AppendText ("硬件版本号:" + des[offset + 4] + "\r\n");
				offset += 5;
				#endregion

				#region /* gps信息 */
				offset += 4;

				int weidu = des[offset + 3] << 24 | des[offset + 2] << 16 | des[offset + 1] << 8 | des[offset + 0];
				txb_analysis.AppendText ("纬度:" + weidu + "\r\n");
				offset += 4;

				int jingdu = des[offset + 3] << 24 | des[offset + 2] << 16 | des[offset + 1] << 8 | des[offset + 0];
				txb_analysis.AppendText ("经度:" + jingdu + "\r\n");
				offset += 4;

				temp_8 = des[offset + 0];
				txb_analysis.AppendText ("速度:" + temp_8 + "\r\n");
				offset += 1;

				temp_16 = des[offset + 1] << 8 | des[offset + 0];
				txb_analysis.AppendText ("方向:" + temp_16 + "\r\n");
				offset += 2;

				temp_16 = des[offset + 1] << 8 | des[offset + 0];
				txb_analysis.AppendText ("高度:" + temp_16 + "\r\n");
				offset += 2;

				txb_analysis.AppendText ("数据上报时间:" + des[offset + 0] + "-" + des[offset + 1] + "-" + des[offset + 2] + " " + des[offset + 3] + ":" + des[offset + 4] + ":" + des[offset + 5] + "\r\n");
				offset += 6;

				txb_analysis.AppendText ("可用卫星颗数:" + des[offset + 0] + "\r\n");
				offset += 2;

				temp_8 = des[offset + 0];
				if ((temp_8 >> 0 & 0x1) == 0x1)
					txb_analysis.AppendText ("GPS天线断开\r\n");
				else
					txb_analysis.AppendText ("GPS天线正常\r\n");

				if ((temp_8 >> 1 & 0x1) == 0x1)
					txb_analysis.AppendText ("GPS已定位\r\n");
				else
					txb_analysis.AppendText ("GPS未定位\r\n");

				if ((temp_8 >> 3 & 0x1) == 0x1)
					txb_analysis.AppendText ("CAN总线异常\r\n");
				else
					txb_analysis.AppendText ("CAN总线正常\r\n");

				if ((temp_8 >> 4 & 0x1) == 0x1)
					txb_analysis.AppendText ("acc开启\r\n");
				else
					txb_analysis.AppendText ("acc断开\r\n");

				if ((temp_8 >> 5 & 0x1) == 0x1)
					txb_analysis.AppendText ("正在充电\r\n");
				else
					txb_analysis.AppendText ("没有充电\r\n");

				offset += 1;
				#endregion
			}
			else
			{
				MessageBox.Show ("输入的数据无法识别");
			}
		}

		void Byte2Ascii (byte[] des, byte[] src, UInt16 cnt)
		{
			byte high;
			byte low;
			UInt16 i = cnt;
			for (i = 0; i < cnt; i++)
			{
				high = (byte) (src[i] >> 4);
				low = (byte) (src[i] & 0xf);
				if (high > 9)
					high = (byte) (high + 'A' - 0xA);
				else
					high = (byte) (high + '0');
				des[i * 2] = high;

				if (low > 9)
					low = (byte) (low + 'A' - 0xA);
				else
					low = (byte) (low + '0');
				des[i * 2 + 1] = low;
			}
		}
		UInt32 Ascii2Byte (byte[] des, byte[] src, UInt16 cnt)
		{
			UInt32 i = 0;
			UInt32 j = 0;
			byte highData;
			byte lowData;
			while (i < cnt)
			{
				if (src[i] == ' ')
				{
					i++;
					continue;
				}
				if ((src[i] == 0x0D) && (src[i+1] == 0x0A))
				{
					return j;
				}
				if (src[i] <= '9' && src[i] >= '0')
					highData = (byte) (src[i] - '0');
				else
				{
					if ((src[i] >= 'A') && (src[i] <= 'Z'))
					{
						highData = (byte) (src[i] - 'A' + 0xa);
					}
					else if ((src[i] >= 'a') && (src[i] <= 'z'))
					{
						highData = (byte) (src[i] - 'a' + 0xa);
					}
					else
					{
						//MessageBox.Show ("输入的数据无法识别");
						return 0xFFFF;
					}
				}
				i++;
				if (src[i] <= '9' && src[i] >= '0')
					lowData = (byte) (src[i] - '0');
				else
				{
					if ((src[i] >= 'A') && (src[i] <= 'Z'))
					{
						lowData = (byte) (src[i] - 'A' + 0xa);
					}
					else if ((src[i] >= 'a') && (src[i] <= 'z'))
					{
						lowData = (byte) (src[i] - 'a' + 0xa);
					}
					else
					{
						//MessageBox.Show ("输入的数据无法识别");
						return 0xFFFF;
					}
				}

				des[j] = (byte) (lowData + (highData << 4));
				j++;
				i++;
			}
			return j;
		}
		void Button1Click (object sender, EventArgs e)
		{
			txb_text.Clear ();
			txb_analysis.Clear ();
		}
	}
}
